﻿/**
 * web 界面上的公共javascript封装
 *
 * @author wangjianghai
 * @date 2017/12/7 11:07
 */
layui.define(['form', 'layer', 'table', 'laypage'], function (exports) {
    var form = layui.form;
    var layer = layui.layer;
    var table = layui.table;
    var laypage = layui.laypage;
    var $ = layui.jquery;
    var window_index = "window_index";

    var obj = {
        /**
         * 页面加载画面
         * @param val1 遮盖系数
         * @param val2 颜色样式
         * @returns {void|*}
         */
        load: load
        /**
         * 关闭页面加载
         */
        , closeLoad: closeLoad
        /**
         * ajax 请求封装
         * -------------- 参考
         * 同步请求 :  ,async: false
         */
        , req: req
        /**
         * 分页查询数据
         * @param params:json数据, 两个*号表示非必须
         * -----------------------------
         * url : url
         * data : 请求的方法参数, json对象
         * before : 渲染数据之前的回调函数 , 携带参数data
         * done : 分页成功后的回调函数
         * tableId : 界面上表格标签的id
         * table : json 对象 table.render() 里面的参数. 参考: http://www.layui.com/doc/modules/table.html#options
         ** pageId : 分页标签的id . 可不传,会自动追加
         */
        , pageQuery: pageQuery
        /**
         * 界面上删除单个
         * @param params:json数据, 两个*号表示非必须
         * ---------------------------
         * url : url
         * data : 方法参数
         * done : 删除成功后的回调函数
         * msg : 删除前的提示, 可为空
         */
        , delTableSelect: delTableSelect
        /**
         * list 界面上的全部删除
         * @param params:json数据, 两个*号表示非必须
         * ---------------------------
         * url : 删除时的url
         * tableId : 表格的id, 不包含#
         * done : 成功后的回调函数 , 携带参数data
         * msg : 删除前的提示, 可为空
         */
        , delTableSelectCheckBox: delTableSelectCheckBox
        /**
         * 必须,只能选择一个
         * @param params
         * --------------------------------
         * tableId : 表格的id, 不包含#
         * done : 成功后的回调函数
         */
        , selectOne: selectOne
    };

    /**
     * ajax 请求封装
     * -------------- 参考
     * 同步请求 :  ,async: false
     */
    function req(params) {
        params = (params == undefined || params == null) ? {} : params;
        params.type = params.type == null ? 'post' : params.type;
        params.done = params.done != null ? params.done : function (d) {
        };

        params.success = function (d) {
            closeLoad();
            if (d.success) {
                params.done(d);
            } else {
                if (d.errorCode == "1001") {
                    layer.alert("用户未登录");
                } else {
                    if (d.message == null) {
                        d.message = "";
                    }
                    layer.alert(d.message, {
                        icon: 2
                    });
                }
                console.log(params.url);
            }
        };
        params.error = function (e) {
            closeLoad();
            layer.msg('系统错误,请重试', {
                offset: '15px'
                , icon: 2
            });
            console.log(params.url);
        }
        $.ajax(params);
    }

    /**
     * 分页查询数据
     * @param params:json数据, 两个*号表示非必须
     * -----------------------------
     * url : url
     * data : 请求的方法参数, json对象
     * before : 渲染数据之前的回调函数 , 携带参数data
     * done : 分页成功后的回调函数
     * tableId : 界面上表格标签的id
     * table : json 对象 table.render() 里面的参数. 参考: http://www.layui.com/doc/modules/table.html#options
     ** pageId : 分页标签的id . 可不传,会自动追加
     */
    function pageQuery(params) {
        params.done = params.done != null ? params.done : function (d) {
        };
        params.before = params.before != null ? params.before : function (d, t) {
        };
        params.data = params.data == null ? {} : params.data;

        req({
            url: params.url
            , data: params.data
            , done: function (data) {
                // 1.判断并处理 page 标签
                if (params.pageId == null || params.pageId == '') {
                    var tableId = params.tableId;
                    if (tableId == null || tableId == "") {
                        tableId = params.table.elem;
                    }
                    var pageId = tableId + "_page-div-id";
                    if ($('#' + pageId).length == 0) {
                        $('#' + tableId).after("<div id='" + pageId + "'></div>");
                    }
                    params.pageId = pageId;
                }

                // 2. 判断 params.table, 简化并且封装公用属性
                if (!(params.table == null || typeof (params.table) == "undefined")) {
                    params.table.elem = params.table.elem == null ? '#' + params.tableId : params.table.elem;//表格id
                    params.table.skin = params.table.skin == null ? 'line,row' : params.table.skin;//行,列边框
                    params.table.even = params.table.even == null ? true : params.table.even;//开启隔行背景
                    params.table.height = params.table.height == null ? tableHeight : params.table.height;
                    params.table.limit = params.table.limit == null ? 9999 : params.table.limit;
                    params.table.data = params.table.data == null ? data.result : params.table.data;

                    // 渲染之前的回调函数
                    params.before(data, params.table);

                    table.render(params.table);
                    params.table.data = null;// 清空数据
                }
                // 3. 执行业务回调函数, 当 params.table==null 时, 也可以把table.render(..) 的逻辑写在这个里面
                params.done(data);

                // 4. 表格数据都处理完后,开始渲染分页标签里的数据
                var page = data.page;
                if (page != null) {
                    $('#' + params.pageId).show();
                    laypage.render({
                        elem: params.pageId
                        , curr: page.pageNum
                        , count: page.total
                        , limit: page.pageSize
                        , limits: [5, 10, 15, 20, 30, 40, 50]
                        , layout: ['prev', 'page', 'next', 'limit', 'skip', 'count']
                        , jump: function (obj, first) {
                            if (!first) {
                                // 防止无限刷新 , 只有监听到的页面index 和当前页不一样是才出发分页查询
                                if (obj.curr != params.data.pageNum || obj.limit != params.data.pageSize) {
                                    params.data.pageNum = obj.curr;
                                    params.data.pageSize = obj.limit;
                                    pageQuery(params);
                                }
                            }
                        }
                    });
                } else {
                    $('#' + params.pageId).hide();
                }
            }
        });
    }

    /**
     * 复选框全部删除功能
     * ----------------------------------
     * url : 删除时的url
     * tableId : 表格的id, 不包含#
     * done : 成功后的回调函数
     * msg : 删除前的提示, 可为空
     */
    function delTableSelectCheckBox(params) {
        var checkStatus = table.checkStatus(params.tableId);
        var length = checkStatus.data.length;//获取选中行数量
        if (length == 0) {
            layer.alert("请至少选择一条记录", {
                icon: 2
            });
            return;
        }
        var list = checkStatus.data; //获取选中行的数据
        var ids = new Array();
        for (var i = 0; i < length; i++) {
            ids[i] = list[i].id;
        }
        delTableSelect({
            url: params.url
            , data: {
                ids: ids.toString()
            }
            , msg: params.msg
            , done: params.done
        });
    }

    /**
     * 删除单个
     * -----------------------------
     * url : url
     * data : 方法参数
     * done : 删除成功后的回调函数
     * msg : 删除前的提示, 可为空
     */
    function delTableSelect(params) {
        params.done = params.done != null ? params.done : function (d) {
        };
        params.msg = params.msg == null ? '确定要删除么?' : params.msg;
        layer.confirm(params.msg, {
            icon: 3,
            title: '提示'
        }, function (index) {
            layer.close(index);
            load();
            req({
                url: params.url
                , async: false
                , data: params.data
                , done: function (data) {
                    layer.alert("删除成功", {
                        icon: 1
                    }, function (index1) {
                        layer.close(index1);
                        params.done(data);// 删除成功后的回调
                    });
                }
            });
        });

    }

    /**
     * 必须,只能选择一个
     * tableId : 表格的id, 不包含#
     * done : 成功后的回调函数
     */
    function selectOne(params) {
        params.done = params.done != null ? params.done : function (d) {
        };
        var checkStatus = table.checkStatus(params.tableId);
        var length = checkStatus.data.length;//获取选中行数量
        if (length == 0) {
            layer.alert("请至少选择一条记录", {
                icon: 2
            });
            return;
        }
        if (length > 1) {
            layer.alert("只能选择一条记录", {
                icon: 2
            });
            return;
        }
        var list = checkStatus.data; //获取选中行的数据
        var select_data = list[0];
        if (select_data == null || select_data.length == 0) {
            layer.alert("获取到的数据对象为空", {
                icon: 2
            });
            return;
        }
        params.done(select_data);
    }

    /*
    ----------------------------------------------------------------------------
     */
    /**
     * 页面加载画面
     * @param val1 遮盖系数
     * @param val2 颜色样式
     * @returns {void|*}
     */
    function load(val1, val2) {
        val1 = (val1 == null || val1 == "" || val1 <= 0 || typeof (val1) == "undefined") ? 0.6 : val1;
        val2 = (val2 == null || val2 == "" || typeof (val2) == "undefined") ? '#393D49' : val2;

        var index = parent.layer.load(1, {
            shade: [val1, val2]
        });
        layui.sessionData(window_index, {key: 'windowkey', value: index});
        return index;
    }

    /**
     * 关掉可能存在的窗口
     */
    function closeLoad() {
        var load_index = layui.sessionData(window_index).windowkey;
        if (load_index != null) {
            parent.layer.close(load_index);
            layui.sessionData(window_index, {key: 'windowkey', remove: true});
        }
    }

    exports('sysweb', obj);
});